/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __4C6753F9_63ED_4b4c_A3BF_6E1436FE78FC__
#define __4C6753F9_63ED_4b4c_A3BF_6E1436FE78FC__

#include "../tools/head.h"

namespace xos_xml
{

    class node_impl : public xos_stl::mem_item< xos::release_impl< node_impl >, thread_lock >,
		public i_xml_node
    {
    public:
        typedef xos::release_impl< node_impl > T;

    public:
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // 
        static int get_xos_item_data( ITEM_DATA*& item_ptr );

    public:
        node_impl();
        ~node_impl();

    public:
        // 
        // 返出指定名称的节点.所有权归节点自己.但是要在父节点释放前,释放.
        // 
        int select_single_node( const char * lpszNodeName, i_xml_node ** ppv );

        // 
        // 将节点及之下内容保存成字串
        // 
        int save_xml_string( char * lpszXml, int nLen, int * lpnLenNeeded );

        // 
        // 返出指定名称的节点.所有权归节点自己.但是要在父节点释放前,释放.
        // 
        int get_parent_node( i_xml_node ** ppv );
        int get_child_node( i_xml_node ** ppv );

        // 
        // 兄弟节点
        // 
        int get_prev_sibling_node( i_xml_node ** ppv );
        int get_next_sibling_node( i_xml_node ** ppv );

        // 节点属性
        int get_node_prop( char * lpszName, int nNameLen, int * lpnNameLenNeed, char * lpszProp, int nPropLen, int * lpnPropLenNeed );
        int get_node_prop( const char * lpszName, char * lpszProp, int nLen, int * lpnLenNeed );
        int set_node_prop( const char * lpszName, const char * lpszProp );
        int reset_property();
        int next_property();

        // 
        // 节点名称
        // 
        int get_node_name( char * lpszName, int nLen, int * lpnLenNeed );
        int set_node_name( const char * lpszName );
        int get_node_value( char * lpszValue, int nLen, int * lpnLenNeed );
        int set_node_value( const char * lpszValue );

        // 
        // 创建节点
        // 
        int create_and_append_node( const char * lpszNodeName, i_xml_node ** ppv );
        int create_node( const char * lpszNodeName, i_xml_node ** ppv );
        int append_node( i_xml_node * pv );
        int remove_node( i_xml_node * pv );

        // 
        // 克隆节点
        // 
        int clone( i_xml_node ** ppv );

    protected:
        int init_data();

    public:
        int init();
        int term();

    private:
        const TiXmlAttribute * m_pAttribute;

    public:
        TiXmlElement * m_pNode;
        bool m_bHasOwner;

    };

} // xos_xml

#endif // __4C6753F9_63ED_4b4c_A3BF_6E1436FE78FC__
